package com.ibm.framework.exception.handler;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.core.Ordered;
import org.springframework.util.Assert;

import com.ibm.framework.exception.concurrent.LogExceptionProcessWorker;
import com.ibm.framework.exception.concurrent.ThreadPoolManager;
import com.ibm.framework.exception.model.RawExceptionInfo;

/**
 * 功能描述： 提取拦截异常的信息，格式化信息。
 * 
 * @author v_pinzhao
 * 
 */
public class LogExceptionHandler implements InitializingBean, Ordered, ExceptionHandler {
    /**
     * 线程池管理
     */
    private ThreadPoolManager threadPool = ThreadPoolManager.getInstance();
    /**
     * 排序初始值same as non-Ordered
     */
    private int order = Integer.MIN_VALUE;
    /**
     * 异常信息提取器
     */
    private ExceptionInfoExtractor extractor;
    /**
     * 异常信息格式化器
     */
    private ExceptionInfoFormater formater;

    /**
     * 处理异常信息
     * 
     * @param exceptionInfo 异常 信息
     */
    public void handle(RawExceptionInfo exceptionInfo) {
        Assert.notNull(exceptionInfo, "RawExceptionInfo can't be null!");
        threadPool.run(new LogExceptionProcessWorker(exceptionInfo, extractor, formater));
    }

    /**
     * 生成提取器或 格式化工具
     * 
     * @throws Exception 异常信息
     */
    public void afterPropertiesSet() throws Exception {
        if (null == extractor) {
            extractor = new DefaultLogExceptionInfoExtractor();
        }
        if (null == formater) {
            formater = new DefaultLogExceptionInfoFormater();
        }
    }

    /**
     * 
     * 功能描述: <br>
     * 〈功能详细描述〉 设置顺序
     * 
     * @param order 顺序
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public final void setOrder(int order) {
        this.order = order;
    }

    /**
     * 获取顺序
     * 
     * @return 顺序值
     */
    public final int getOrder() {
        return this.order;
    }

    /**
     * 
     * 功能描述: <br>
     * 〈功能详细描述〉 设置提取器
     * 
     * @param extractor 提取器
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    /**
     * public void setExtractor(ExceptionInfoExtractor extractor) { this.extractor = extractor; }
     * 
     * /** 设置异常信息 格式化工具
     * 
     * @param formater 格式化工具
     */
    public void setFormater(ExceptionInfoFormater formater) {
        this.formater = formater;
    }
}
